/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package co.edu.uniandes.mueblesAlpes.negocio;

import co.edu.uniandes.lab1.muebles.anotaciones.Identificador;
import co.edu.uniandes.lab1.muebles.anotaciones.mueble;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Oscar Ballesteros
 */
public class Catalogo {

    public void registrarMuebles(List internos,List externos){
        List<String> archivo = new ArrayList<String>();
        archivo.add("Interior");
        for(Object muebleInterno : internos ){
            System.out.println("Clase "+muebleInterno.getClass().getName());
            Class clase = muebleInterno.getClass();
            if(esMueble(clase)){
               Field identificador = buscarIdentificador(clase);
               if(identificador != null){
                   Object valorId = obtenerValorIdentificador(muebleInterno,identificador);
                   archivo.add(valorId+"\t "+clase.getSimpleName());
               }
            }
        }
        archivo.add("Exterior");
        for(Object muebleInterno : externos ){
            System.out.println("Clase "+muebleInterno.getClass().getName());
            Class clase = muebleInterno.getClass();
            if(esMueble(clase)){
               Field identificador = buscarIdentificador(clase);
               if(identificador != null){
                   Object valorId = obtenerValorIdentificador(muebleInterno,identificador);
                   archivo.add(valorId+"\t "+clase.getSimpleName());
               }
            }
        }
        generarArchivo(archivo);
    }

    private Field buscarIdentificador(Class clase) {
        Field[] campos = clase.getDeclaredFields();
        for(Field  campo : campos){
            if(campo.isAnnotationPresent(Identificador.class)){
                return campo;
            }
        }
        return null;
    }

    private boolean esMueble(AnnotatedElement elemento) {
        return elemento.isAnnotationPresent(mueble.class);
    }

    private Object obtenerValorIdentificador(Object muebleInterno, Field identificador) {
        //la obtencion del valor se basa en la especificacion de POJO
        String nombreCampo = identificador.getName();
        String finalNombre = nombreCampo.substring(1);
        String inicioNombre =  nombreCampo.substring(0, 1);
        nombreCampo = "get"+inicioNombre.toUpperCase().concat(finalNombre);
        try{
            Method metodo = muebleInterno.getClass().getDeclaredMethod(nombreCampo, null);
            return metodo.invoke(muebleInterno, null);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(Catalogo.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalArgumentException ex) {
            Logger.getLogger(Catalogo.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvocationTargetException ex) {
            Logger.getLogger(Catalogo.class.getName()).log(Level.SEVERE, null, ex);
        }catch(NoSuchMethodException e){
            e.printStackTrace();
        }
        return null;
    }

    private void generarArchivo(List<String> archivo) {
       File file = new File("C:/CatalogoInstanciado.txt");
        try {
            file.createNewFile();
            PrintWriter pw = new PrintWriter(file);
            for(String linea : archivo){
                pw.println(linea);
            }
            pw.flush();
            pw.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Catalogo.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Catalogo.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
